package org.lanqiao.api;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.*;

/**
 * @author 李静
 * @describe
 * @data
 */
@Slf4j
@ServerEndpoint("/websocket02/{web}")
@Controller
public class WebSocketServer02 {

    //静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;
    //创建一个线程安全的map
    private static Map<String, WebSocketServer02> users = Collections.synchronizedMap(new HashMap());
    //与某个客户端的连接会话，需要通过它来给客户端发送数据
    private Session session;
    //放入map中的key,用来表示该连接对象
    private String username;
    //存放接收的数据
    private String jsonlist = null;
    //用來存放连接成功后的标识
    private List<String> list = new ArrayList<>();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("web") String name) {
        System.out.println("当前session：" + session + "，用户:" + name + "连接WebSocket02成功");
        this.session = session;
        this.username = name;
        list.add(name);    //连接成功之后将连接标识进行存储
        users.put(username, this);   //加入map中,为了测试方便使用username做key
        addOnlineCount();           //调用方法在线数加1
        System.out.println("当前人数为：" + getOnlineCount());
        log.info(username + "加入！当前在线人数为" + getOnlineCount());
        try {
            //连接成功socket返回的消息
            this.session.getBasicRemote().sendText("连接成功");
        } catch (IOException e) {
            log.error("websocket IO异常");
        }

    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        users.remove(this.username);  //从set中删除
        subOnlineCount();           //在线数减1
        log.info("一个连接关闭！当前在线人数为" + getOnlineCount());
    }

    /**
     * 收到客户端消息后触发的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message) throws IOException {
        System.out.println("接受来自客户端的数据：" + message);
        log.info("来自客户端的消息:" + message);
        //拿到小程序发送的消息之后向大屏幕进行礼物id推送
        for (WebSocketServer02 item : users.values()) {
            System.out.println("web:"+item.username.equals("web"));
            //判断是否是大屏幕的连接
            if(item.username.equals("web")) {
                    item.session.getBasicRemote().sendText(message);
            }
        }

    }


    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误 session: " + session);
        error.printStackTrace();
    }

    /**
     * 群发自定义消息
     */
    public void sendInfo(String message) throws IOException {
        for (WebSocketServer02 item : users.values()) {
            try {
                item.session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                continue;
            }
        }
    }

    //获取当前连接人数
    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    //该方法用来记录房间人数+1
    public static synchronized void addOnlineCount() {
        WebSocketServer02.onlineCount++;
    }

    //该方法用来记录房间人数-1
    public static synchronized void subOnlineCount() {
        WebSocketServer02.onlineCount--;
    }
}
